package com.hsc.offer;

import java.util.Stack;

/**
 * @author
 * @date 2025-07-04
 * @Description 20、定义栈的数据结构，请在该类型中实现一个能够得到栈中所含最小元素的min函数 （时间复杂度应为O（1））。
 */
public class OfferTest15 {

    static Stack<Integer> stack = new Stack<>();

    public static void main(String[] args) {
        OfferTest15 offerTest15 = new OfferTest15();
        offerTest15.push(1);
        offerTest15.push(2);
        offerTest15.push(3);
//        System.out.println("offerTest15.top() = " + offerTest15.top());
//        offerTest15.push(4);
        System.out.println("offerTest15.top() = " + offerTest15.top());
//        offerTest15.pop();
//        System.out.println(stack.search(3));
//        System.out.println("offerTest15.min() = " + offerTest15.min());


    }
    // 在线笔试的情况 直接定义栈 使用栈的api 快速完成

    public void push(int node) {
        // 压栈
        stack.push(node);
    }
    public void pop() {
        // 弹栈 取出栈顶的元素 并且移除元素 若栈为空 则会抛出异常
//        stack.pop(); 这个函数会对栈的结构进行修改
        System.out.println(stack.pop());
    }
    // 获取栈首
    // 获取 offerTest15 放入的第一个元素
    public int top() {
        // 取出栈顶的元素 但是不会对栈进行修改 若栈为空 则会抛出异    常
        // 从栈底开始 0 1 2
        return stack.get(0);
    }

    public int min() {
        if (stack.isEmpty()) {
            return -1;
        }
        int min = stack.get(0);// 获取栈底元素
        for (int i = 0; i < stack.size(); i++) {
            if (stack.get(i) < min) {
                min = stack.get(i);
            }
        }
        return min;
    }

    // 面试的情况 使用  数组定义栈的数据结构 模拟栈
    // 初始化 容量 128 的数组
//    int[] array = new int[128];
//    // 指针
//    int point = 0;
//    // 定义最小值
//    int min;
//
//    public void push(int node) {
//        // 压栈 也就是往数组放元素
//        array[point] = node;
//        // 获取最小值
//        min = Math.min(node, min);
//        // 数组扩容 数组不可能一直往里面放
//        if (point == array.length - 1) {
//            int[] newArray = new int[array.length * 2];
//            // 数组复制
//            System.arraycopy(array, 0, newArray, 0, array.length);
//        }
//        point++;
//    }
//
//    public void pop() {
//        // 弹栈 也就是取出栈顶的元素 ，这里就是从后往前取元素
//        // 严谨性判断
//        if (point == 0) {
//            return;
//        }
//        point--;
//        // 拿出去了最小值 最小值得重新计算
//        if (array[point] == min) {
//            min = Integer.MAX_VALUE;
//            for (int i = 0; i < array.length; i++) {
//                // 获取最小值
//                min = Math.min(array[i], min);
//            }
//        }
//    }
//// 获取放入的第一个元素
//    public int top() {
//        if (point > 0) {
//            return array[0];
//        }
//        return -1;
//
//    }
//   要求：（时间复杂度应为O（1））。
//    public int min() {
//        return min;
//    }


}
